#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string>
#include <sys/epoll.h>

using namespace std;

int main()
{
    //将0号文件描述符改为非阻塞
    int flag = fcntl(0, F_GETFL); //获取0号文件描述符的属性
    fcntl(0, F_SETFL, flag | O_NONBLOCK); //设置0号文件描述符的属性

    int epfd = epoll_create(6);
    if(epfd < 0)
    {
        perror("epoll_create");
        return 0;
    }

    struct epoll_event ee;
    ee.events = EPOLLIN;
    ee.data.fd = 0;

    epoll_ctl(epfd, EPOLL_CTL_ADD, 0, &ee);

    while(1)
    {
        struct epoll_event arr[10];
        int ret = epoll_wait(epfd, arr, 10, 0);
        if(ret < 0)
        {
            perror("epoll_wait");
            return 0;
        }
        else if(ret == 0)
        {
            continue;
        }

        string str;
        while(1)
        {
            char buf[2] = {0};
            int ret = read(arr[0].data.fd, buf, sizeof(buf) - 1);
            if(ret < 0)
            {
                //EAGAIN和EWOULDBLOCK是linux环境下的两个错误码，在非阻塞IO中经常会碰到
                if(errno == EAGAIN || errno == EWOULDBLOCK)
                {
                    break;
                }
            }
            //之前只是打印输出，并没有将读到的数据保存起来
            str.append(buf);//将buf当中的数据存入到str中
        }
        printf("str:%s\n", str.c_str());
    }
    return 0;
}


